package cn.unknowpupil.init.utils.thread;


import cn.unknowpupil.init.domain.system.SysLogRecord;
import cn.unknowpupil.init.service.system.ISysLogRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Future;

/**
 * Created at 2020/11/10 by w10g <br>
 * Initialize GlobalConfig ... <br>
 *
 * @author unknowpupil
 * @since 0.0.1
 */
@Component
public class SpringBootExecutor {
    /**
     * 通过注解引入配置
     */
    @Resource(name = "threadPoolTaskExecutor")
    private ThreadPoolTaskExecutor executor;
    @Autowired
    ISysLogRecordService sysLogRecordService;

    public void sendSms() throws Exception {
        //使用Future方式执行多任务
        //生成一个集合
        List<Future> futures = new ArrayList<>();
        List<Integer> list = new ArrayList<>();

        //获取后台全部有效运营人员的集合
        List<SysLogRecord> users = sysLogRecordService.list(null);

        for (SysLogRecord response : users) {
            //并发处理
            if (response.getOperName() != null) {
                Future<?> future = executor.submit(() -> {
                    //发送短信
                    System.err.println("发送短信");
                });
                futures.add(future);
            }
        }
        //查询任务执行的结果
        for (Future<?> future : futures) {
            //CPU高速轮询：每个future都并发轮循，判断完成状态然后获取结果，这一行，是本实现方案的精髓所在。即有10个future在高速轮询，完成一个future的获取结果，就关闭一个轮询
            while (true) {
                //获取结果
                if (future.isDone() && !future.isCancelled()) {
                    Integer i = (Integer) future.get();
                    System.out.println("任务i=" + i+Thread.currentThread().getName() + "获取完成!" + new Date());
                    list.add(i);
                    break;//当前future获取结果完毕，跳出while
                } else {
                    //每次轮询休息1毫秒（CPU纳秒级），避免CPU高速轮循耗空CPU---》新手别忘记这个
                    Thread.sleep(1);
                }
            }
        }

    }

}
